home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 4664 / 4664.xpi / chrome / twitterbar.jar / content / mobile / overlay.js < prev    next >
Text File  |  2010-02-08  |  16KB  |  482 lines

  1. var TWITTERBAR = {
  2.     debug : true,
  3.     
  4.     lastTweet : null,
  5.     covertMode : false,
  6.     
  7.     countShowing : false,
  8.     
  9.     version : null,
  10.     
  11.     lastUrl : null,
  12.     
  13.     load : function () {
  14.         document.getElementById("twitter-statusbarbutton").style.display = 'none';
  15.         
  16.         this.version = Components.classes["@mozilla.org/extensions/manager;1"].getService(Components.interfaces.nsIExtensionManager).getItemForID("{1a0c9ebe-ddf9-4b76-b8a3-675c77874d37}").version;
  17.         
  18.         TWITTERBAR.prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService).getBranch("extensions.twitter.");    
  19.         TWITTERBAR.prefs.QueryInterface(Components.interfaces.nsIPrefBranch2);
  20.         TWITTERBAR.prefs.addObserver("", this, false);
  21.         
  22.         TWITTERBAR.debug = TWITTERBAR.prefs.getBoolPref("debug");
  23.         
  24.         var showFirstRun = false;
  25.         var oldVersion = TWITTERBAR.prefs.getCharPref("version");
  26.         var newVersion = this.version;
  27.         
  28.         if (oldVersion != newVersion) {
  29.             TWITTERBAR.prefs.setCharPref("version", newVersion);
  30.         }
  31.         
  32.         if (!oldVersion) {
  33.             showFirstRun = true;
  34.         }
  35.         else {
  36.             var oldParts = oldVersion.split(".");
  37.             var newParts = newVersion.split(".");
  38.         
  39.             if (newParts[0] != oldParts[0] || newParts[1] != oldParts[1]) {
  40.                 showFirstRun = true;
  41.             }
  42.         }
  43.         
  44.         if (showFirstRun) {
  45.             setTimeout(function () {
  46.                 Browser.addTab("http://www.chrisfinke.com/firstrun/twitterbar.php?v=" + newVersion, true);
  47.             }, 3000);
  48.         }
  49.         
  50.         var oldsearchcomplete = document.getElementById("urlbar-edit").getAttribute("onsearchcomplete");
  51.         
  52.         document.getElementById("urlbar-edit").setAttribute("onsearchcomplete", "TWITTERBAR.count(); if (!TWITTERBAR.postKey()) { " + oldsearchcomplete + "}");
  53.         document.getElementById("urlbar-edit").addEventListener("blur", TWITTERBAR.blur, true);
  54.         document.getElementById("urlbar-edit").addEventListener("focus", TWITTERBAR.focus, true);
  55.         
  56.         this.buttonCheck();
  57.         
  58.         document.getElementById("browsers").addEventListener("load", TWITTERBAR.DOMContentLoaded, true);
  59.         
  60.         // Get new trends every 2 hours.
  61.         TWITTERBAR.trendTimer = setInterval(function () { TWITTERBAR_COMMON.getTrends(); }, 1000 * 60 * 60 * 2);
  62.         
  63.         setTimeout(function() { TWITTERBAR_COMMON.getTrends(); }, 1000 * 10);
  64.         
  65.         document.getElementById("addons-list").addEventListener("AddonOptionsLoad", TWITTERBAR_OPTIONS.mobileInit, false);
  66.     },
  67.     
  68.     showFirstRun : function () {
  69.     },
  70.     
  71.     unload : function () {
  72.         TWITTERBAR.prefs.removeObserver("", this);
  73.         
  74.         document.getElementById("browsers").removeEventListener("load", TWITTERBAR.DOMContentLoaded, true);
  75.         document.getElementById("urlbar-edit").removeEventListener("blur", TWITTERBAR.blur, true);
  76.         document.getElementById("urlbar-edit").removeEventListener("focus", TWITTERBAR.focus, true);
  77.         
  78.         document.getElementById("addons-list").removeEventListener("AddonOptionsLoad", TWITTERBAR_OPTIONS.mobileInit, false);
  79.         
  80.         clearInterval(TWITTERBAR.trendTimer);
  81.     },
  82.     
  83.     observe : function(subject, topic, data) {
  84.         if (topic != "nsPref:changed") {
  85.             return;
  86.         }
  87.         
  88.         switch(data) {
  89.             case "button":
  90.                 if (document.getElementById("twitterBox")) {
  91.                     document.getElementById("twitterBox").setAttribute("hidden", buttonMode);
  92.                 }
  93.             break;
  94.             case "debug":
  95.                 TWITTERBAR.debug = true;//TWITTERBAR.prefs.getBoolPref("debug");
  96.             break;
  97.         }
  98.     },
  99.     
  100.     DOMContentLoaded : function (event) {
  101.         if (event.originalTarget instanceof HTMLDocument) {
  102.             var page = event.originalTarget;
  103.         
  104.             if (page.location.href.match(/chrisfinke.com\/oauth\/twitterbar/i)) {
  105.                 var urlArgs = page.location.href.split("?")[1].split("&");
  106.                 
  107.                 var token = "";
  108.                 
  109.                 for (var i = 0; i < urlArgs.length; i++) {
  110.                     var argParts = urlArgs[i].split("=");
  111.                     
  112.                     if (argParts[0] == "oauth_token"){
  113.                         token = argParts[1];
  114.                     }
  115.                 }
  116.                 
  117.                 var accessor = {
  118.                     consumerSecret : TWITTERBAR_COMMON.oauth.consumer_secret,
  119.                     tokenSecret : TWITTERBAR_COMMON.oauth.request_token.oauth_token_secret
  120.                 };
  121.  
  122.                 var message = {
  123.                     action : TWITTERBAR_COMMON.oauth.serviceProvider.accessTokenURL,
  124.                     method : "GET",
  125.                     parameters : [
  126.                         ["oauth_consumer_key",TWITTERBAR_COMMON.oauth.consumer_key],
  127.                         ["oauth_token", token],
  128.                         ["oauth_signature_method",TWITTERBAR_COMMON.oauth.serviceProvider.signatureMethod],
  129.                         ["oauth_version","1.0"]
  130.                     ]
  131.                 };
  132.                 
  133.                 var OAuth = TWITTERBAR_OAUTH();
  134.                 
  135.                 OAuth.setTimestampAndNonce(message);
  136.                 OAuth.SignatureMethod.sign(message, accessor);
  137.                 
  138.                 var oAuthArgs = OAuth.getParameterMap(message.parameters);
  139.                 var authHeader = OAuth.getAuthorizationHeader("http://twitter.com/", oAuthArgs);
  140.                 
  141.                 var req = new XMLHttpRequest();
  142.                 req.mozBackgroundRequest = true;
  143.                 req.open(message.method, message.action, true);
  144.                 req.setRequestHeader("Authorization", authHeader);
  145.                 
  146.                 req.onreadystatechange = function () {
  147.                     if (req.readyState == 4) {
  148.                         if (TWITTERBAR.debug) {
  149.                             TWITTERBAR.log("Auth (DOM) ("+req.status+"): " + req.responseText);
  150.                         }
  151.                         
  152.                         if (req.status == 200) {
  153.                             try {
  154.                                 var parts = req.responseText.split("&");
  155.                         
  156.                                 TWITTERBAR.prefs.setCharPref("access_token.oauth_token", parts[0].split("=")[1]);
  157.                                 TWITTERBAR.prefs.setCharPref("access_token.oauth_token_secret", parts[1].split("=")[1]);
  158.  
  159.                                 TWITTERBAR.prefs.setCharPref("oauth_timestamp", (new Date().getTime()));
  160.                                 
  161.                                 if (TWITTERBAR.lastTweet) {
  162.                                     TWITTERBAR.covertMode = true;
  163.                                     TWITTERBAR.postRequest(TWITTERBAR.lastTweet);
  164.                                 }
  165.                             } catch (e) {
  166.                                 TWITTERBAR_COMMON.alert(TWITTERBAR_COMMON.strings.getFormattedString("twitterbar.otherError", [ e, req.responseText ]));
  167.                             }
  168.                         }
  169.                         else if (req.status >= 500) {
  170.                             TWITTERBAR_COMMON.alert(TWITTERBAR_COMMON.strings.getString("twitterbar.failWhale"));
  171.                         }
  172.                         else {
  173.                             TWITTERBAR_COMMON.alert(TWITTERBAR_COMMON.strings.getFormattedString("twitterbar.otherError", [ req.status, req.responseText ]));
  174.                         }
  175.                     }
  176.                 };
  177.  
  178.                 req.send(null);
  179.             }
  180.             else if (TWITTERBAR.prefs.getBoolPref("showTrends")){
  181.                 try {
  182.                     if (!page.location.host.match(/^twitter\.com$/)) {
  183.                         return;
  184.                     }
  185.                 } catch (e) {
  186.                     return;
  187.                 }
  188.                 
  189.                 TWITTERBAR_COMMON.addTrends(page);
  190.             }
  191.         }
  192.     },
  193.     
  194.     buttonCheck : function () {
  195.         try {
  196.             var mode = TWITTERBAR.prefs.getBoolPref("button");
  197.             var button = document.getElementById("twitterBox");
  198.             
  199.             button.setAttribute("hidden", mode.toString());
  200.         } catch (e) { }
  201.         
  202.         try {
  203.             var mode = TWITTERBAR.prefs.getBoolPref("oneriotButton");
  204.             var button = document.getElementById("twitter-oneriot-box");
  205.             
  206.             button.setAttribute("hidden", mode.toString());
  207.         } catch (e) { }
  208.     },
  209.     
  210.     focus : function () {
  211.         var status = document.getElementById("urlbar-edit").value;
  212.         
  213.         if (status.match(/^https?:\/\//i)) {
  214.             TWITTERBAR.lastUrl = status;
  215.         }
  216.         
  217.         document.getElementById("twitter-statusbarbutton").style.display = '';
  218.     },
  219.     
  220.     blur : function () {
  221.         document.getElementById("twitter-statusbarbutton").style.display = 'none';
  222.     },
  223.     
  224.     count : function () {
  225.         var length = this.getCharCount();
  226.         
  227.         if (length > 140) {
  228.             document.getElementById("twitter-statusbarbutton").setAttribute("toolong", "true");
  229.         }
  230.         else {
  231.             document.getElementById("twitter-statusbarbutton").removeAttribute("toolong");
  232.         }
  233.     },
  234.     
  235.     reAuthorize : function () {
  236.         TWITTERBAR.prefs.setCharPref("oauth_username", "");
  237.         TWITTERBAR.prefs.setCharPref("access_token.oauth_token", "");
  238.         TWITTERBAR.prefs.setCharPref("access_token.oauth_token_secret", "");
  239.         TWITTERBAR.prefs.setCharPref("oauth_timestamp", "");
  240.         
  241.         this.oAuthorize();
  242.     },
  243.     
  244.     oAuthorize : function () {
  245.         var accessor = {
  246.             consumerSecret : TWITTERBAR_COMMON.oauth.consumer_secret,
  247.             tokenSecret : ""
  248.         };
  249.         
  250.         var message = {
  251.             action : TWITTERBAR_COMMON.oauth.serviceProvider.requestTokenURL,
  252.             method : "GET",
  253.             parameters : [
  254.                 ["oauth_consumer_key",TWITTERBAR_COMMON.oauth.consumer_key],
  255.                 ["oauth_signature_method",TWITTERBAR_COMMON.oauth.serviceProvider.signatureMethod],
  256.                 ["oauth_version","1.0"]
  257.             ]
  258.         };
  259.         
  260.         var OAuth = TWITTERBAR_OAUTH();
  261.         
  262.         OAuth.setTimestampAndNonce(message);
  263.         OAuth.SignatureMethod.sign(message, accessor);
  264.         
  265.         var oAuthArgs = OAuth.getParameterMap(message.parameters);
  266.         var authHeader = OAuth.getAuthorizationHeader("http://twitter.com/", oAuthArgs);
  267.         
  268.         var req = new XMLHttpRequest();
  269.         req.mozBackgroundRequest = true;
  270.         req.open(message.method, message.action, true);
  271.         req.setRequestHeader("Authorization", authHeader);
  272.         
  273.         req.onreadystatechange = function () {
  274.             if (req.readyState == 4) {
  275.                 if (TWITTERBAR.debug) {
  276.                     TWITTERBAR.log("Auth ("+req.status+"): " + req.responseText);
  277.                 }
  278.                 
  279.                 if (req.status == 200) {
  280.                     var parts = req.responseText.split("&");
  281.                 
  282.                     try {
  283.                         TWITTERBAR_COMMON.oauth.request_token.oauth_token = parts[0].split("=")[1];
  284.                         TWITTERBAR_COMMON.oauth.request_token.oauth_token_secret = parts[1].split("=")[1];
  285.                     
  286.                         if (TWITTERBAR_COMMON.confirm(TWITTERBAR_COMMON.strings.getString("twitterbar.oauthRequest1") + "\n\n" + TWITTERBAR_COMMON.strings.getString("twitterbar.oauthRequest2"))) {
  287.                             Browser.addTab("http://twitter.com/oauth/authorize?oauth_token="+TWITTERBAR_COMMON.oauth.request_token.oauth_token, true);
  288.                             BrowserUI.activeDialog.close();
  289.                         }
  290.                     } catch (e) {
  291.                         TWITTERBAR_COMMON.alert(TWITTERBAR_COMMON.strings.getString("twitterbar.oauthError1") + "\n\n" + e + "\n\n" + req.responseText);
  292.                     }
  293.                 }
  294.                 else if (req.status >= 500) {
  295.                     TWITTERBAR_COMMON.alert(TWITTERBAR_COMMON.strings.getString("twitterbar.failWhale"));
  296.                 }
  297.                 else {
  298.                     TWITTERBAR_COMMON.alert(TWITTERBAR_COMMON.strings.getFormattedString("twitterbar.otherError", [ req.status, req.responseText ]));
  299.                 }
  300.             }
  301.         };
  302.         
  303.         req.send(null);
  304.     },
  305.     
  306.     post : function (clickedOnButton) {
  307.         if (clickedOnButton && TWITTERBAR.prefs.getBoolPref("confirm")) {
  308.             if (!TWITTERBAR_COMMON.confirmPost()) {
  309.                 return;
  310.             }
  311.         }
  312.         
  313.         document.getElementById("twitter-statusbarbutton").setAttribute("busy","true");
  314.         
  315.         var urlbar = document.getElementById("urlbar-edit");
  316.         var status = urlbar.value.replace("$$", content.document.title);
  317.         
  318.         if (status.match(/^https?:\/\/[^\s]+$/i)) {
  319.             this.lastUrl = status;
  320.             
  321.             var prefix = (TWITTERBAR.prefs.getCharPref("web").replace("$$", content.document.title).replace(/^\s+|\s+$/, "") + " ");
  322.             status = prefix + status;
  323.         }
  324.         
  325.         urlbar.value = TWITTERBAR_COMMON.strings.getString("twitterbar.posting");
  326.         
  327.         TWITTERBAR_SHORTENERS.shortenUrls(status, function (status) { TWITTERBAR.postRequest(status); });
  328.     },
  329.     
  330.     postRequest : function (status) {
  331.         if (TWITTERBAR.debug) {
  332.             TWITTERBAR.log("postRequest: " + status);
  333.         }
  334.         
  335.         TWITTERBAR.lastTweet = status;
  336.         
  337.         var accessor = {
  338.             consumerSecret : TWITTERBAR_COMMON.oauth.consumer_secret,
  339.             tokenSecret : TWITTERBAR.prefs.getCharPref("access_token.oauth_token_secret")
  340.         };
  341.  
  342.         var message = {
  343.             action : "http://twitter.com/statuses/update.xml",
  344.             method : "POST",
  345.             parameters : [
  346.                 ["oauth_consumer_key",TWITTERBAR_COMMON.oauth.consumer_key],
  347.                 ["oauth_token", TWITTERBAR.prefs.getCharPref("access_token.oauth_token")],
  348.                 ["oauth_signature_method",TWITTERBAR_COMMON.oauth.serviceProvider.signatureMethod],
  349.                 ["oauth_version","1.0"],
  350.                 ["source","twitterbar"],
  351.                 ["status", status]
  352.             ]
  353.         };
  354.         
  355.         var OAuth = TWITTERBAR_OAUTH();
  356.         
  357.         OAuth.setTimestampAndNonce(message);
  358.         OAuth.SignatureMethod.sign(message, accessor);
  359.         
  360.         var argstring = "source=twitterbar&status=" + encodeURIComponent(status);
  361.  
  362.         var oAuthArgs = OAuth.getParameterMap(message.parameters);
  363.         var authHeader = OAuth.getAuthorizationHeader("http://twitter.com/", oAuthArgs);
  364.         
  365.         var req = new XMLHttpRequest();
  366.         req.mozBackgroundRequest = true;
  367.         req.open(message.method, message.action, true);
  368.         req.setRequestHeader("Authorization", authHeader);
  369.         req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
  370.         req.setRequestHeader("Content-Length", argstring.length);
  371.         
  372.         req.onreadystatechange = function () {
  373.             if (req.readyState == 4) {
  374.                 if (TWITTERBAR.debug) {
  375.                     TWITTERBAR.log("Post ("+req.status+"): " + req.responseText);
  376.                 }
  377.                 
  378.                 document.getElementById("twitter-statusbarbutton").removeAttribute("busy");
  379.                 
  380.                 if (req.status == 401) {
  381.                     if (req.responseText.indexOf("expired") != -1) {
  382.                         TWITTERBAR.reAuthorize();
  383.                     }
  384.                     else {
  385.                         TWITTERBAR_COMMON.alert(TWITTERBAR_COMMON.strings.getFormattedString("twitterbar.twitterError", [ req.status, req.responseText ]));
  386.                     }
  387.                     
  388.                     // I think TwitterBar sends a 401 when you've hit your rate limit.
  389.                     // This is the reason so many people complained about being asked to reauthorize.
  390.                 }
  391.                 else if (req.status >= 500) {
  392.                     TWITTERBAR_COMMON.alert(TWITTERBAR_COMMON.strings.getString("twitterbar.failWhale"));
  393.                 }
  394.                 else if (req.status == 200) {
  395.                     TWITTERBAR.lastTweet = null;
  396.                     
  397.                     if (!TWITTERBAR.covertMode) {
  398.                         document.getElementById("urlbar-edit").value = TWITTERBAR_COMMON.strings.getString("twitterbar.success");
  399.  
  400.                         setTimeout(function () { TWITTERBAR.afterPost(); }, 1000);
  401.                     }
  402.                 }
  403.                 else {
  404.                     TWITTERBAR_COMMON.alert(TWITTERBAR_COMMON.strings.getFormattedString("twitterbar.otherError", [ req.status, req.responseText ]));
  405.                 }
  406.                 
  407.                 TWITTERBAR.covertMode = false;
  408.             }
  409.         };
  410.         
  411.         req.send(argstring);
  412.     },
  413.     
  414.     afterPost : function () {
  415.         var urlbar = document.getElementById("urlbar-edit");
  416.         urlbar.value = this.lastUrl;
  417.         
  418.         if (TWITTERBAR.prefs.getBoolPref("tab")){
  419.             Browser.addTab("http://twitter.com/" + TWITTERBAR.prefs.getCharPref("oauth_username"), true);
  420.             BrowserUI.activeDialog.close();
  421.         }
  422.     },
  423.     
  424.     getCharCount : function () {
  425.         var status = document.getElementById("urlbar-edit").value;
  426.         status = status.replace("$$", content.document.title);
  427.         
  428.         var length = status.length;
  429.         
  430.         var offset = 0;
  431.         
  432.         var urls = status.match(/(https?:\/\/[^\s]+)/ig);
  433.         
  434.         if (urls) {
  435.             for (var i = 0; i < urls.length; i++) {
  436.                 var urlLength = TWITTERBAR_SHORTENERS.getUrlLength(urls[i]);
  437.                 
  438.                 if (urls[i].length > urlLength) {
  439.                     offset += (urls[i].length - urlLength);
  440.                 }
  441.             }
  442.         }
  443.         
  444.         length -= offset;
  445.         
  446.         if (status.match(/^https?:\/\//i)) {
  447.             var prefix = (TWITTERBAR.prefs.getCharPref("web").replace("$$", content.document.title).replace(/^\s+|\s+$/, "") + " ");
  448.             length += prefix.length;
  449.         }
  450.         
  451.         return length;
  452.     },
  453.     
  454.     postKey : function (e) {
  455.         if (!e || (e.keyCode != e.DOM_VK_RETURN && e.keyCode != 117 && e.keyCode != 76 && e.keyCode != 68 && e.keyCode != 17 && e.keyCode != 18)){
  456.             var urlbar = document.getElementById("urlbar-edit");
  457.             var status = urlbar.value;
  458.  
  459.             if (status.indexOf(" --post") != -1){
  460.                 var status = status.split(" --post")[0].replace("$$", content.document.title);
  461.                 
  462.                 if (status.match(/^https?:\/\//i)) {
  463.                     var webtext = (TWITTERBAR.prefs.getCharPref("web").replace("$$", content.document.title).replace(/^\s+|\s+$/, "") + " ");
  464.                     status = webtext + status;
  465.                 }
  466.                 
  467.                 status = status.replace("$$", content.document.title)
  468.                 
  469.                 urlbar.value = TWITTERBAR_COMMON.strings.getString("twitterbar.posting");
  470.                 
  471.                 document.getElementById('twitter-statusbarbutton').setAttribute("busy", "true");
  472.                 
  473.                 TWITTERBAR_SHORTENERS.shortenUrls(status, function (status) { TWITTERBAR.postRequest(status); });
  474.             }
  475.         }
  476.     },
  477.     
  478.     log : function (message) {
  479.         var consoleService = Components.classes["@mozilla.org/consoleservice;1"].getService(Components.interfaces.nsIConsoleService);
  480.         consoleService.logStringMessage("TWITTERBAR: " + message);
  481.     }
  482. };